home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / FINGERD.C < prev    next >
C/C++ Source or Header  |  1989-08-18  |  3KB  |  129 lines

  1. /* Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "socket.h"
  7. #include "session.h"
  8. #include "proc.h"
  9. #include "dirutil.h"
  10.  
  11. extern char *Fdir;
  12. static int Sfinger = -1;    /* Prototype socket for service */
  13.  
  14. static void fingerd __ARGS((int s,void *unused,void *p));
  15.  
  16. /* Start up finger service */
  17. int
  18. finstart(argc,argv,p)
  19. int argc;
  20. char *argv[];
  21. void *p;
  22. {
  23.     struct sockaddr_in lsocket;
  24.     int s;
  25.  
  26.     if(Sfinger != -1){
  27.         freeargs(argc,argv);
  28.         return 0;
  29.     }
  30.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  31.     chname(Curproc,"Finger listener");
  32.  
  33.     lsocket.sin_family = AF_INET;
  34.     lsocket.sin_addr.s_addr = Ip_addr;
  35.     if(argc < 2)
  36.         lsocket.sin_port = IPPORT_FINGER;
  37.     else
  38.         lsocket.sin_port = atoi(argv[1]);
  39.  
  40.     freeargs(argc,argv);
  41.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  42.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  43.     listen(Sfinger,1);
  44.     for(;;){
  45.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  46.             break;    /* Service is shutting down */
  47.  
  48.         /* Spawn a server */
  49.         newproc("fingerd",512,fingerd,s,NULL,NULL);
  50.     }
  51.     return 0;
  52. }
  53. static void
  54. fingerd(s,unused,p)
  55. int s;
  56. void *unused;
  57. void *p;
  58. {
  59.     char user[80];
  60.     FILE *fp;
  61.     struct mbuf *bp;
  62.     char *file,*cp;
  63.     int c;
  64.  
  65.     sockowner(s,Curproc);
  66.     log(s,"open Finger");
  67.     recvline(s,user,80);
  68.     rip(user);
  69.     if(strlen(user) == 0){
  70.         fp = dir(Fdir,0);
  71.         if(fp == NULLFILE)
  72.             usprintf(s,"No finger information available\n");
  73.         else
  74.             usprintf(s,"Known users on this system:\n");
  75.     } else {
  76.         file = pathname(Fdir,user);
  77.         /* Check for attempted security violation (e.g., somebody
  78.          * might be trying to finger "../ftpusers"!)
  79.          */
  80.         if(strncmp(file,Fdir,strlen(Fdir)) != 0){
  81.             fp = NULLFILE;
  82.             usprintf(s,"Invalid user name %s\n",user);
  83.         } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  84.             usprintf(s,"User %s not known\n",user);
  85.         free(file);
  86.     }
  87.     while(fp != NULLFILE){
  88.         if((bp = alloc_mbuf(BLKSIZE+1)) == NULLBUF)
  89.             break;
  90.         cp = bp->data;
  91.         while(bp->cnt < BLKSIZE && (c = fgetc(fp)) != EOF){
  92.             switch(c){
  93.             case '\r':
  94.                 continue;
  95.             case '\n':
  96.                 *cp++ = '\r';
  97.                 *cp++ = '\n';
  98.                 bp->cnt += 2;
  99.                 break;
  100.             default:
  101.                 *cp++ = c;
  102.                 bp->cnt++;
  103.                 break;
  104.             }
  105.         }                
  106.         if(bp->cnt != 0){
  107.             if(send_mbuf(s,bp,0,NULLCHAR,0) == -1)
  108.                 break;
  109.         } else {
  110.             free_p(bp);
  111.             break;
  112.         }
  113.     }
  114.     if(fp != NULLFILE)
  115.         fclose(fp);
  116.     close_s(s);
  117.     log(s,"close Finger");
  118. }
  119. int
  120. fin0(argc,argv,p)
  121. int argc;
  122. char *argv[];
  123. void *p;
  124. {
  125.     close_s(Sfinger);
  126.     Sfinger = -1;
  127.     return 0;
  128. }
  129.